import axios from "axios";
import { getToken, removeToken, setToken } from "@/utils/cookie";
import store from "@/store";
import router from "@/router";

const service = axios.create({
  baseURL: import.meta.env.VITE_APP_BASE_API,
  timeout: 10000,
});

// 请求拦截器
service.interceptors.request.use(
  (config) => {
    // 检查是否是音乐API的请求
    if (config.isMusicApi) {
      // 如果是，则将请求URL重写到后端的音乐代理端点
      // 例如, /song/detail -> /api/music/song/detail
      config.url = "/api/music" + config.url;
      // baseURL 保持不变, 仍为 /dev-api (开发时) 或线上API地址 (生产时)
    }

    // 可以在这里添加请求头等配置
    const token = getToken();
    if (token) {
      config.headers["Authorization"] = token;
    }
    return config;
  },
  (error) => {
    return Promise.reject(error);
  }
);

// 响应拦截器
service.interceptors.response.use(
  (response) => {
    // 检查并更新sa-token
    const newToken = response.headers["sa-same-token"];
    if (newToken) {
      setToken(newToken);
    }

    // 检查是否是音乐API的请求
    if (response.config.isMusicApi) {
      // 音乐API的响应成功(HTTP 200),但内容结构和主后端不同。
      // 为了让调用方(如Vuex action)能以统一的方式处理,
      // 我们将音乐API的返回数据(response.data)包装在一个data属性里,
      // 模拟主后端的 { code, message, data } 结构。
      // 这样，调用方总可以通过 `res.data` 来获取核心数据。
      return { data: response.data };
    }

    // 如果响应类型是 blob，则直接返回响应，不进行处理
    if (response.request.responseType === "blob") {
      return response;
    }
    const res = response.data;
    if (res.code === 200) {
      return res;
    } else if (res.code === 404) {
      return Promise.reject(new Error("请求路径不存在"));
    } else if (res.code === 401) {
      removeToken();
      //这里获取不到this，所以需要使用全局变量
      store.commit("SET_USER_INFO", null);
      router.push("/login");
      return Promise.reject(new Error("当前登录已过期，请重新登录"));
    } else {
      // 可以在这里统一处理错误
      return Promise.reject(new Error(res.message || "请求失败"));
    }
  },
  (error) => {
    return Promise.reject(error);
  }
);

export default service;
